package persistencia;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import Excepciones.ExcepcionAdministracionDeNiveles;

import negocio.cv.Nivel;
import negocio.cv.TipoNivel;


public class DACNivel extends DACBase {
	
	private Nivel nivel;
	private List<Nivel> niveles;
	private TipoNivel tipoNivel;
	private CallableStatement clstm;
	private ResultSet rs;
	

	public DACNivel(DACBase dacBase) {
		super(dacBase);
		// TODO Auto-generated constructor stub
	}

	/**
	 * De acuerdo al tipo de nivel que ingrese como parametro
	 * devulevo todos los niveles de ese tipo
	 * @param tipo tipo de nivel 
	 * @return lista de niveles del tipo especofocado
	 */
	public List<Nivel> consultarNiveles(String tipo){
		niveles = new ArrayList<Nivel>();
		try{
			clstm = getConn().prepareCall("{call tiponivelConsultar(?)}");
			clstm.setString("tipo", tipo);
			clstm.execute();
			rs = clstm.getResultSet();	
			
			if (rs.next()) {
				tipoNivel = new TipoNivel();
				tipoNivel.setIdTipoNivel(rs.getInt("idtiponivel"));
			}
			else{
				throw new ExcepcionAdministracionDeNiveles();
			}
			
			clstm = getConn().prepareCall("{call nivelConsultarTodosPorTipo(?)}");
			clstm.setInt("tipo", tipoNivel.getIdTipoNivel());
			clstm.execute();
			rs = clstm.getResultSet();	
			
			niveles = new ArrayList<Nivel>();			
			while (rs.next()) {
				nivel = new Nivel();
				nivel.setIdNivel(rs.getInt("idnivel"));
				nivel.setNombre(rs.getString("nombre"));
				nivel.setDescripcion(rs.getString("descripcion"));
				nivel.setOrden(rs.getInt("orden"));
				nivel.setTipoDeNivel(tipoNivel);
				
				niveles.add(nivel);
            }			           

			rs.close();
			rs = null;
			clstm.close();
            clstm = null;
            
           
            
		}    
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarNiveles()_DacNivel");
			}
		catch (ExcepcionAdministracionDeNiveles e) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(null, "Inconveniente con tipo de niveles", "Error", JOptionPane.ERROR);
		}
		
	    return niveles;		
	}
	
	public Nivel consultarNivel(int id){
		
		try{					
			clstm = getConn().prepareCall("{call nivelConsultar(?)}");
			clstm.setInt("id", id);
			clstm.execute();
			rs = clstm.getResultSet();			
			if (rs.next()) {
				nivel = new Nivel();
				nivel.setIdNivel(rs.getInt("idnivel"));
				nivel.setNombre(rs.getString("nombre"));
				nivel.setDescripcion(rs.getString("descripcion"));
				nivel.setOrden(rs.getInt("orden"));
            }			           

			rs.close();
			rs = null;
			clstm.close();
            clstm = null;           
            
		}    
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarNiveles()_DacNivel");
			}		
		
	    return nivel;		
	}
	
	

}
